#include "git-ref.h"

#include <cassert>

#include <git2/refs.h>

namespace git
{

std::string_view Ref::fullname() const {
    assert(ref_);
    return git_reference_name(ref_);
}

std::string Ref::oidHex() const {
    assert(ref_);
    const git_oid *id = git_reference_target(ref_);
    char buffer[GIT_OID_HEXSZ + 1] = {};
    if (0 == git_oid_fmt(buffer, id)) {
        return std::string(buffer, GIT_OID_HEXSZ);
    } else {
        return std::string();
    }
}

git_repository *Ref::repo() const {
    assert(ref_);
    return git_reference_owner(ref_);
}

Ref::Ref(git_reference *ref)
    : ref_(ref) {
}

Ref::Ref(Ref &&ref)
    : ref_(ref.ref_) {
    ref.ref_ = nullptr;
}

Ref::~Ref() {
    if (ref_) {
        git_reference_free(ref_);
        ref_ = nullptr;
    }
}

Ref &Ref::operator=(Ref &&b) {
    if (this != &b && ref_ != b.ref_) {
        if (ref_) {
            git_reference_free(ref_);
        }
        ref_ = b.ref_;
        b.ref_ = nullptr;
    }
    return *this;
}

} // namespace git

